iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
1
Mobile Development

新手試試用Flutter做Netflix UI系列 第 13

[Day13]Flutter Netflix UI 類似影片以及通知頁面

  • 分享至 

  • xImage
  •  

大家好,今天做的頁面用到比較不一樣的有GridView.count、BoxShadow

類似影片頁面

使用GridView.count,crossAxisCount設定項目橫向數量為3,
childAspectRatio可以設定子Widget比例,
crossAxisSpacing、mainAxisSpacing分別是橫縱的項目間隔

Widget _buildRelatedSeries() {
    return GridView.count(
      shrinkWrap: true,
      primary: false,
      padding: const EdgeInsets.symmetric(vertical: 20),
      crossAxisSpacing: 10,
      mainAxisSpacing: 10,
      crossAxisCount: 3,
      childAspectRatio: 9 / 12,
      children: List.generate(12, (index) => _buildEachRelatedSeries()),
    );
  }

使用List.generate產生12個子項目

List.generate(12, (index) => _buildEachRelatedSeries()

每個子項目都是一個Container並用圖片做背景裝飾,導圓角

_buildEachRelatedSeries() {
  return Container(
    decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(8.0),
        image: DecorationImage(
            image: AssetImage("assets/videolist/videolist${Random().nextInt(7)+1}.jpg"),fit: BoxFit.cover)),
  );
}

通知頁面

這一個比較簡單一點只是前面用到的Container,跟幾個Text用Column和Row排版

 _buildNewVideoNotification(String title,String subtitle) {
  return Row(
    children: [
      Container(
        margin: EdgeInsets.all(8.0),
        width: 120,
        height: 70,
        decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(8.0),

            image: DecorationImage(
                image: AssetImage(
                    "assets/videolist/videolist${Random().nextInt(7) +
                        1}.jpg"), fit: BoxFit.cover)),
      ),
      Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text("$title",style: TextStyle(fontSize: 16.0),),
            Text("$subtitle",style: TextStyle(color: Colors.grey,fontSize: 16.0),),
            Text("9月27日",style: TextStyle(color: Colors.grey,fontSize: 12.0))
          ],
        ),
      )
    ],
  );
}

用陰影做疊圖的效果


下面這段要做的是讓他看起來像幾個圖案疊在一起
所以我用BoxDecoration裡面的boxShadow,搭配margin以及縮小寬與高做到這個效果
boxShadow可以放數個BoxShadow
設定Offset就會看到那個陰影,還可以更改color、blurRadius、spreadRadius,後面兩項跟模糊程度有關係

 boxShadow: [
                BoxShadow(color: Color(0xff444444), offset: Offset(16, 8)),
                BoxShadow(color: Color(0xff666666), offset: Offset(8, 4)),
              ],

設定好兩個陰影的顏色跟偏移就可以看到它了,再縮小一下尺寸,然後用margin填充空間,即可完成
Container可以設定marginpadding,不要搞錯兩者用途不同了,一個向外,一個向內

_buildManyVideosNotification(String title, String subtitle) {
  return Row(
    children: [
      Padding(
        padding: const EdgeInsets.all(8.0),
        child: Container(
          margin: EdgeInsets.only(right: 16.0, bottom: 16.0),
          width: 104,
          height: 58,
          decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(8.0),
              boxShadow: [
                BoxShadow(color: Color(0xff444444), offset: Offset(16, 8)),
                BoxShadow(color: Color(0xff666666), offset: Offset(8, 4)),
              ],
              image: DecorationImage(
                  image: AssetImage(
                      "assets/videolist/videolist${Random().nextInt(7) + 1}.jpg"),
                  fit: BoxFit.cover)),
        ),
      ),
      Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              "$title",
              style: TextStyle(fontSize: 16.0),
            ),
            Text(
              "$subtitle",
              style: TextStyle(color: Colors.grey, fontSize: 16.0),
            ),
            Text("9月27日",
                style: TextStyle(color: Colors.grey, fontSize: 12.0))
          ],
        ),
      )
    ],
  );
}

今日完成之頁面如下
Day13

GitHub連結: flutter-netflix-clone


上一篇
[Day12]Flutter Netflix UI 即將上線頁面使用VideoPlayer
下一篇
[Day14]Flutter Netflix UI 運用SliverAppBar
系列文
新手試試用Flutter做Netflix UI30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言